package compi;

import java.io.*;
import java.util.Vector;

import data.TablaSimbolos;


public class Compi 
{
	private PrintStream _writer;
	private Asintac _asintac;
	private PrintStream _errWriter;
	private static Compi instance;
	
	public static void main(String args[]) 
	{
		if ( args.length < 1 )
		{
			System.err.println("Error, se requiere un parámetro");
			System.exit(1);
		}
		instance = new Compi(args[0]);
		instance.compilar();
	}
	
	/**
	 * Constructor
	 * @param nFich
	 */
	public Compi(String nFich)
	{
		try 
		{
			_asintac = new Asintac(nFich);
			_writer = new PrintStream(new File(nFich.replace(".txt", "")+ ".out"));
			_errWriter = new PrintStream(new File(nFich.replace(".txt", "")+".err"));
			System.setErr(_errWriter);
		} catch (IOException e) 
		{
			System.err.println("Error: fichero de entrada no encontrado");
			_writer.close();
			_errWriter.close();
			System.exit(1);
		}
	}
	
	/**
	 * Compilar
	 */
	public void compilar()
	{
		System.out.println("-- Comenzando compilacion.");
		Vector<String> codigo = _asintac.PROGRAMA();
		
		if ( _asintac.numErrores() == 0 )
		{
			for ( String s : codigo )
				_writer.println(s);
			System.out.println("Generadas " + codigo.size() + " lineas de codigo sin errores.");
		}
		else
			System.out.println("-- Compilacion terminada con " + _asintac.numErroresLexicos() + " errores lexicos, "
					+ _asintac.numErroresSemanticos() + " semanticos y " + _asintac.numErroresSintacticos() + " sintacticos.");
		
		// Temporal
		System.out.println("\n\n------------- TABLA DE SIMBOLOS --------------");
		System.out.println("Variables:\n"+TablaSimbolos.getInstancia().getVariables()+"\n\n");
		System.out.println("Metodos:\n"+TablaSimbolos.getInstancia().getMetodos());
		
		_writer.close();
		_errWriter.close();
	}

}
